// 1.es6新增的箭头函数,箭头this
// 一使用(=>)箭头符号定义的函数的语法特性
// let fn=function (name){
//     return name
// }

// let fn=name=>name;
// console.log(fn("kunkub"));

// 2.如果你定义的函数,并不需要传递参数,可以用()直接返回
// let fn=function(){
//     return ("aaa")
// }
// let fn=()=>"aaa";
// console.log(fn());

// 总结:普通函数:
// function () {
//     //code
// }
// let function=()=>{
//     //code
// }

// 4.箭头函数传递2个或2个以上的参数,并实现运算返回
// let fn=function(x,y){
//     return x+y
// }

// let fn=(x,y)=>x+y
// console.log(fn(10,20));

// 5.如果函数体需要更复杂的操作,可以将箭头符号的右边使用传统函数体
// let fn= (x,y) => {
//     return x+y;
// }
// console.log(fn(10,20));

// 6.如果箭头符号右边是对象,返回的是对象,则需要用圆括号去包含
// let fn=name=>({name:name,age:100})
// console.log(fn("aaa").name);//aaa

// 翻译成普通函数
// let fn1=function(name){
//     return {
//         name:name,
//         age:100
//     }
// }
// console.log(fn1("bbb"));

// 7.如果箭头符号左边是对象作为参数,右边是对象的属性运算,也支持:
// let fn=({name,age})=>name+age;
// console.log(fn({name:10,age:18}));//28

// 8.自我立即执行函数,也可以使用箭头符号来创建 
// (function (name){
//     console.log(name);
// })("kunkun")

// ((name)=>{
//     console.log(name);
// })("kunkun")


// 箭头函数this.
// 箭头函数就是没有function关键字,而是一个类似箭头的函数
// 普通函数的this:
// 1.this总是代表它的直接调用者,例如:obj.function,那么function中this就是obj
// 2.在默认情况下,(非严格)未使用use strict,没找到直接调用者,this指向window
// 3.在严格模式下,没有直接调用者的函数中的this是undefined
// 4.使用call,apply,bind绑定this,指向新对象

// 箭头函数中的this
// 1.箭头函数会捕获其所在的上下文的this值,作为自己的this值,自己本身没有this
// 2.箭头函数的this永远都指向其所在的上下文,任何方法都改变不了指向call,apply,bind都不行

// *箭头函数会捕获所在的上下文的this值,作为自己的this*
// var obj={
//     a:10,
//     b:function(){
//         console.log(this.a);//10
//     },
//     c:function(){
//         return ()=>{
//             console.log(this.a);
//         }
//     }

// }
// obj.b()
// obj.c()()


// var obj={
//     a:10,
//     b:()=>{
//         console.log(this.a);//undefined
//         console.log(this);//window
//     },
//     c:()=>{
//         console.log(this.a);//undefined
//         console.log(this);//window
//     }

// }
// obj.b()
// obj.c()













// 3.箭头函数作为匿名函数,是不能作为构造函数的,不能使用new
// var B=()=>{
//     value:"aa"
// }
// var b=new B()

//4.箭头函数不绑定arguments,用rest参数解决的
// function A(a){
//     console.log(arguments);
// }
// A(1)

// var C=(c)=>{
//     console.log(arguments);
// }
// C(1)//报错

// var D=(...d)=>{
//     console.log(d);
// }
// D(1)


// var obj={
//     a:10,
//     b:function(n){
//         var fn= (v) => v+this.a
//         // console.log(this);
//         return fn(n)
//     },
//     c:function(n){
//         var fn=(v) => v+this.a;
//         var k={a:20};
//         return fn.call(k,n);//call没用
//     }

// }
// console.log(obj.b(1));
// console.log(obj.c(1));


// this指向:
let obj={
    name:'junlei',
    age:1,
    fn:function(){
        setTimeout(()=>{
            console.log(this.name+","+this.age);
        },1000)
    }
}
obj.fn()